package com.farm.business.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

/**
 * 单独指定定时任务的线程池
 * 目的：为了避免并发
 * @Scheduled注解在不做任何配置的时候默认是单线程的
 * 如果配置了线程池则默认会使用线程池来分发@Scheduled的线程 如果配置的线程数 >1 则@Scheduled标注的定时任务自然默认就是并行执行的了
 * springBoot中的定时任务默认走的线程池是ThreadPoolTaskScheduler有就会走这个默认的没有就走你自己额外配置的
 * 因为我们其他地方配置了这个@Bean(name = "threadPoolTaskExecutor")且当时还没如下这个配置所以定时任务都是并行的可能会存在并发问题 但threadPoolTaskExecutor不是ThreadPoolTaskScheduler类型的(不是默认的)
 * 所以我们重新写一个我们自己的且是ThreadPoolTaskScheduler类型的线程池设置成1就可以把定时任务变成串行了
 * 说白了优先级问题
 */
@Configuration
public class SchedulingConfig {
    @Bean
    public ThreadPoolTaskScheduler schedulerTaskThreadPool() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(1); // 配置线程池的大小
        scheduler.setThreadNamePrefix("schedulerTaskThreadPool-");
        return scheduler;
    }

}
